using UnityEngine;
using System.Collections;

/// <summary>
/// Linea curva bezier. Hereda las propiedades de la Linea. Esta clase se encarga de dibujar curvas.
/// </summary>
public class LineaCurvaBezier : Linea {
	
	public Transform anclaje1;
	public Transform anclaje2;
	
	public bool drawBezierCurve;
	
	//
	/// <summary>
	/// The puntos bezier. Marca la precision del dibujo y de la longitud de la curva. Valores mayores implican que no haya aceleraciones en curvas
	/// </summary>
	public int puntosBezier;
	
	/// <summary>
	/// Array que va a guardar los valores de los puntosBezier
	/// </summary>
	private Vector3[] BezierLineArray;
	
	/// <summary>
	/// Awake this instance.
	/// </summary>
	void Awake () {
		length= Length();
	}
	
	/// <summary>
	/// Raises the draw gizmos event. Dibuja la curva y los puntos de anclaje
	/// </summary>
	public void OnDrawGizmos(){
		
			if (drawLines)
			{
				//Esto dibuja las lineas que unen los puntos de anclaje de una curva bezier
				Gizmos.color= Color.blue;
				Gizmos.DrawLine(inicio.position, anclaje1.position);
				Gizmos.DrawLine(anclaje1.position, anclaje2.position);
				Gizmos.DrawLine(anclaje2.position, destino.position);
				
				//esto dibuja las lineas que forman la curva en si misma.
				
			
			
			}
		
			if (drawBezierCurve){
				Gizmos.color=Color.red;
				BezierLineArray= new Vector3[puntosBezier];
				float actualpoint=0;
				for(int i=0; i<puntosBezier; i++)
				{
					actualpoint=(1.0f/(puntosBezier-1))*i;
					BezierLineArray[i]= CalculatePoint(actualpoint);
				}
				
				for (int i=0; i<puntosBezier-1;i++)
				{
					Gizmos.DrawLine(BezierLineArray[i],BezierLineArray[i+1]);
					
				}
				}
			}
	
	/// <summary>
	/// Calculates the point. Calcula la curva.
	/// </summary>
	/// <returns>
	/// The point.
	/// </returns>
	/// <param name='t'>
	/// T.
	/// </param>
	public override Vector3 CalculatePoint(float t)
    {
        	float u = 1.0f - t;
        	float tt  = t * t;
        	float uu  = u * u;
       		float uuu  = uu * u;
        	float ttt = tt * t;
     
        	Vector3 p = uuu * inicio.position; //first term
        	p += 3 * uu * t * anclaje1.position; //second term
        	p += 3 * u * tt * anclaje2.position; //third term
        	p += ttt * destino.position; //fourth term
     
        	return p;
    }
	
	/// <summary>
	/// Length this instance. Longitud de la curva
	/// </summary>
	public override float Length()
	{
			float longitud = 0;
		
			BezierLineArray= new Vector3[puntosBezier];
				float actualpoint=0;
				for(int i=0; i<puntosBezier; i++)
				{
					actualpoint=(1.0f/(puntosBezier-1))*i;
					BezierLineArray[i]= CalculatePoint(actualpoint);
				}
				
				for (int i=0; i<puntosBezier-1;i++)
					longitud = longitud + longitudPitagoras(BezierLineArray[i],BezierLineArray[i+1]);
					
			return longitud;	
	}
		
		
}
